<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板</title>
    <script type="application/javascript" src="../js/vue.js"></script>

    <style>

    </style>
</head>
<body>

<!--
v-for语法  v-for="(p,index) in personArr" :key="p.id"
-->
<!--
面试题:
    1.虚拟dom中key的作用?
      key是虚拟dom对象的表示,当状态中的数据发生变化时,Vue会根据【新数据】生成【新的虚拟dom】，随后Vue进行【新虚拟dom】与【旧虚拟dom】的差异比较。
    2.比较规则：
      2.1 旧虚拟dom中找到了与新虚拟dom相同的key：
          *若虚拟dom中内容没变，直接使用之前的真实dom；
          *若虚拟dom中内容变了，则生成新的真实的dom，随后替换带哦页面之前的真实dom
      2.2 旧虚拟dom中未找到与新虚拟dom相同的key
          *创建新的真实的dom，随后渲染到页面

    3. 用index作为key可能会产生问题：
       3.1 若对数据进行：逆序添加、逆序删除等破坏顺序操作，会产生没有必要的真实dom更新=>界面效果没问题,效率低;
       3.2 如果结构中还包含输入类的dom,会产生错误dom更新=>界面有问题

    4.开发中如何选择key?
      4.1 最后使用每条数据的唯一标识作为key
      4.2 如果不存在对数据的的逆序添加、删除等破坏顺序操作，仅用于渲染列表展示，使用index作为key没有问题
-->
<div id="app13">

    <!--  遍历列表  -->
    <h2>人员列表</h2>
    <button @click="addPerson">添加人员</button>
    <ul>
        <li v-for="(person,index) in personArr" :key="person.id">
            {{person.name}}-{{person.age}}
            <label><input type="text"></label>
        </li>

    </ul>

    <hr/>

    <!--  遍历对象信息  -->
    <h2>车辆信息</h2>
    <ul>
        <li v-for="(value,key) in car" :key="key">
            {{key}}:{{value}}
        </li>
    </ul>

</div>

<script type="application/javascript">
    Vue.config.productionTip = false    // 阻止vue在启动时生成生产提示

    const vm = new Vue({
        el: "#app13",
        // 变量数据
        data: {
            personArr: [
                {
                    id: 1,
                    name: "张三",
                    age: 18,
                    sex: "男"
                }, {
                    id: 2,
                    name: "李四",
                    age: 20,
                    sex: "女"
                }, {
                    id: 3,
                    name: "王五",
                    age: 100,
                    sex: "未知"
                }
            ],
            car: {
                id: 1,
                name: 'a8',
                color: 'red',
                price: 10000
            }
        },
        // 方法
        methods: {
            addPerson() {
                this.personArr.push({
                    id: this.personArr.length + 1,
                    name: "荣一",
                    age: 100,
                    sex: "男"
                })
            }
        },
        // 计算属性
        computed: {},
        // 监听属性
        watch: {},
    })
</script>
</body>
</html>
